//
//  clump.swift
//  Swift_base_grammar
//
//  Created by lantaiyuan on 2017/9/13.
//  Copyright © 2017年 lantaiyuan. All rights reserved.
//  集合

import Foundation
import UIKit


/// 数组
func array() {
    /**
     - 数组同样使用 []
     - 数字不需要包装成 NSNumber
     - 结构体同样需要包装成 NSValue
     */
    // [String] － 数组，是存放字符串的数组
    // let array = ["zhangsan", "lisi"]
    // [NSObject] － 存放 NSObject 对象
    // 提问：数组中存放相同类型的情况多！原因：数组是通过下标来遍历的！
    // 数组的准确类型，可以使用 option + click 判断
    let array = ["zhangsan","lisi",18,NSValue.init(cgPoint: CGPoint.init(x: 10, y: 10))] as [Any]
    print(array)
}

/// 数组的可变 NSMutableArray 和不可变 NSArray
func mutableArr() {
    // 定义数组的时候，自动推导的类型是 [String]，决定数组中只能存放 String 类型
    // var array = ["zhangsan", "lisi"]
    // Swift 中有一个 `AnyObject`，表示任意对象
    // OC 中所有对象都继承自 NSObject
    // Swift 中的对象，可以没有任何父类
    var array:[AnyObject] = ["zhangsan" as AnyObject,"lisi" as AnyObject]
    
    //追加对象
    array.append("wangwu" as AnyObject)
    
    // 不能直接追加数字，如果定义数组的时候，指定类型是 [NSObject]，就可以存放数字
    array.append(4 as AnyObject)
    print(array)
}

/// 数组的遍历
func loopArray() {
    let array = ["zhangsan","lisi"]
    for s in array {
        print("s:\(s)")
    }
}

/// 数组的增、删、改
func operatorArr() {
    var array = ["zhangsan","lisi"]
    //增
    array.append("wangwu")
    
   //改
   array[0] = "zhaoliu"
   
   //删除第一个
    array.removeFirst()
   //删除最后一个
   array.removeLast()
   //删除所有元素,保留容量
   array.removeAll(keepingCapacity: true)
    print(array,"容量:\(array.capacity)")
    
}

/// 测试数组容量
func testCapacity() {
    // 定义一个存放字符串的数组，并没有分配控件
    var array:[String]
    //分配空间
    array = [String]()
    
    for i in 0..<16 {
        array.append("张三 \(i)")
        // 当插入元素时，如果容量不够，会在当前容量基础上 * 2，方便后续的元素的增加
        print(array[i] + "容量 \(array.capacity)")
    }
    print(array)
}

/// 定义并且实例化一个空的存放字符串的数组
func array2() {
    var array = [String]()
    array.append("zhaoli")
    print(array)
}

/// 数组的合并
func array3() {
    var array:[NSObject] = ["zhangsan" as NSObject,"lisi" as NSObject]
    let array2:[NSObject] = ["赵云" as NSObject,"吕布" as NSObject]
    let array3 = ["李甜甜",18] as [Any]
    array += array2
    // 注意：在合并数组的时候，数组的类型必须保持一致
    array +=  array3 as! [NSObject]
    print(array)
}

/// 创建字典
func dict() {
    /**
     OC 中定义字典使用 {}
     Swift 中仍然使用 []，是通过值对
     */
    // [String(key) : NSObject(value)]
    let dict = ["name":"小田","age":18] as [String : Any]
    print(dict)
    
    // 提问：什么类型的字典使用最多？[String: AnyObject]
    // 因为从网络上获取的 JSON 有一个要求，KEY 必须是 NSString
    /**
     An object that may be converted to JSON must have the following properties:
     - Top level object is an NSArray or NSDictionary
     顶级节点必须是字典或者数组
     - All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
     所有的对象必须是 NSString, NSNumber, NSArray, NSDictionary, or NSNull
     如果是 数组 或者字典，内部同样只能包含 String, Number, NSNull
     - All dictionary keys are NSStrings
     所有的 key 必须都是 NSString
     - NSNumbers are not NaN or infinity
     NSNumber 不能为空或者无穷大
     
     在 JSON 中字符串有引号，Number 没有 引号，空值 null
     */
}

/// 可变字典
func dict2() {
    var dict = ["name":"小田","age":18] as [String : Any]
    dict["name"] = "笑话"
    dict["title"] = "boss"
    print(dict)
    
    for (key,value) in dict {
        print("key:\(key),value:\(value)")
    }
}


/// 字典的合并
func dictAppend() {
    var dict = ["name":"小花","age":18] as [String : Any]
    let dict2 = ["title":"boss","name":"靓女"]
    //将 dict2 的内容合并到 dict 中
    for (key,value) in dict2 {
        dict[key] = value
    }
    
    print(dict)
}
